package de.lessvoid.nifty.examples.libgdx; import com.badlogic.gdx.ApplicationListener; import com.badlogic.gdx.Gdx; import com.badlogic.gdx.Input; import com.badlogic.gdx.assets.AssetManager; import de.lessvoid.nifty.Nifty; import de.lessvoid.nifty.render.batch.BatchRenderConfiguration; import de.lessvoid.nifty.render.batch.BatchRenderDevice; import de.lessvoid.nifty.examples.NiftyExample; import de.lessvoid.nifty.gdx.input.GdxInputSystem; import de.lessvoid.nifty.gdx.input.GdxKeyRepeatSystem; import de.lessvoid.nifty.gdx.render.GdxBatchRenderBackendFactory; import de.lessvoid.nifty.gdx.sound.GdxSoundDevice; import de.lessvoid.nifty.spi.time.impl.AccurateTimeProvider; import java.util.logging.LogManager; /** * @author Aaron Mahan <aaron@forerunnergames.com> */ public class LibgdxExampleApplication implements ApplicationListener { private Nifty nifty; private final NiftyExample niftyExample; private AssetManager assetManager; private GdxKeyRepeatSystem keyRepeat; private final int atlasWidth; private final int atlasHeight; public LibgdxExampleApplication(final NiftyExample niftyExample, final int atlasWidth, final int atlasHeight) { this.niftyExample = niftyExample; this.atlasWidth = atlasWidth; this.atlasHeight = atlasHeight; } /** * Called when the {@link com.badlogic.gdx.Application} is first created. */ @Override public void create() { configureLogging(); assetManager = new AssetManager(); BatchRenderConfiguration config = new BatchRenderConfiguration(); config.disposeImagesBetweenScreens = false; config.useHighQualityTextures = false; config.fillRemovedImagesInAtlas = true; config.atlasWidth = atlasWidth; config.atlasHeight = atlasHeight; BatchRenderDevice batchRenderDevice = new BatchRenderDevice(GdxBatchRenderBackendFactory.create(), config); batchRenderDevice.enableLogFPS(); GdxInputSystem gdxInputSystem = new GdxInputSystem(Gdx.input); // Set up key repeat for arrows and backspace (useful when navigating Nifty textfields, for example) // LibGDX will not repeat these non-printable keys without using a GdxKeyRepeatSystem. keyRepeat = new GdxKeyRepeatSystem(gdxInputSystem); keyRepeat.setKeyRepeat(Input.Keys.LEFT, true); keyRepeat.setKeyRepeat(Input.Keys.RIGHT, true); keyRepeat.setKeyRepeat(Input.Keys.UP, true); keyRepeat.setKeyRepeat(Input.Keys.DOWN, true); keyRepeat.setKeyRepeat(Input.Keys.BACKSPACE, true); keyRepeat.setKeyRepeat(Input.Keys.FORWARD_DEL, true); // Initialize Nifty nifty = new Nifty(batchRenderDevice, new GdxSoundDevice(assetManager), gdxInputSystem, new AccurateTimeProvider()); // Initialize the Nifty example. niftyExample.prepareStart(nifty); // Run the Nifty example. if (niftyExample.getMainXML() != null) { nifty.fromXml(niftyExample.getMainXML(), niftyExample.getStartScreen()); } else { nifty.gotoScreen(niftyExample.getStartScreen()); } } private void configureLogging() { try { LogManager.getLogManager().readConfiguration(ClassLoader.getSystemResourceAsStream("logging.properties")); } catch (Exception e) { Gdx.app.error("LibgdxExampleApplication", "Could not read logging configuration file: assets/logging" + ".properties", e); } } /** * Called when the {@link com.badlogic.gdx.Application} is resized. This can happen at any point during a non-paused * state but will never happen before a call to {@link #create()}. * <p/> * Note: This will be called once automatically during initialization, directly after create(). * * @param width the new width in pixels * @param height the new height in pixels */ @Override public void resize(int width, int height) { } /** * Called when the {@link com.badlogic.gdx.Application} should render itself. * Since LibGDX doesn't have an explicit main loop, anything that must be called continuously, i.e., once per * frame, must go here. See https://code.google.com/p/libgdx/wiki/ApplicationLifeCycle for more information. */ @Override public void render() { assetManager.update(); // Asynchronously load custom, non-Nifty resources if needed. Must be called once per frame. keyRepeat.update(); // Process any repeating input keys being held down nifty.update(); // Nifty's processing of non-rendering tasks (input, sound, etc). Must be called once per frame. nifty.render(true); // Nifty draws your GUI here. true = Nifty will clear the screen. Must be called once per frame. } /** * Called when the {@link com.badlogic.gdx.Application} is paused. An Application is paused before it is destroyed, * when a user pressed the Home button on Android or an incoming call happened. On the desktop this will only be * called immediately before {@link #dispose()} is called. */ @Override public void pause() { } /** * Called when the {@link com.badlogic.gdx.Application} is resumed from a paused state. On Android this happens when * the activity gets focus again. On the desktop this method will never be called. */ @Override public void resume() { } /** * Called when the {@link com.badlogic.gdx.Application} is destroyed. Preceded by a call to {@link #pause()}. */ @Override public void dispose() { nifty.exit(); // Quit Nifty and dispose of all Nifty's resources. assetManager.dispose(); // Dispose all assets (resources) in the AssetManager and stop all asynchronous loading. Gdx.app.exit(); // Schedule an exit from the LibGDX application. } }